/**
 *    Copyright 2009-2015 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.session;

import java.sql.Connection;

/**
 * 事务隔离级别，枚举。对应Connection的隔离级别。
 * 隔离性解决以下问题：
 * 1、脏读，指一个事务处理过程里读取了另一个未提交的事务中的数据，然后使用了这个数据；
 * 2、不可重复读，指在一个事务内，多次读取同一个数据，在这个事务还没有结束 ，另一个事务也访问该同一数据，
 * 		但是由于第二个事务的修改，那么第一个事务两次读取的数据可能不一样，因此称为不可重复读；即同一个事务中原始数据读取不可重复。
 * 		 注：不可重复读和脏读的区别，脏读是某一个事务读取另一个事务未提交的脏数据;
 * 3、幻读，指当事务不是独立执行时发生的一种现象，例如第一个事务对一个表中的数据进行修改，这种数据涉及到表中的全部数据行，同时，
 * 		第二个事务也对这个表数据进行修改，这个修改是对表中新增/删除一条数据，那么操作第一个事务的用户发现表中的数据还没有修改的数据行，
 * 		就好像发生了幻觉一样，这就是发生了幻读。注:幻读和不可重复读都读取另一条已经提交的事务，所不同的是不可重复读查询的都是同一数据项，
 * 		而幻读针对的是一批数据整体。
 * @author Clinton Begin
 */
public enum TransactionIsolationLevel {
  //表示不支持事务
  NONE(Connection.TRANSACTION_NONE),
  //【读已提交】禁止出现脏读，但是不可重复读和幻读可能发送
  READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
  //【读未提交】最低级别，任何情况都会发生。
  READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
  //【可重复读】可避免脏读、不可重复读的发生。
  REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
  //【串行化】避免脏读、不可重复读，幻读的发生。
  SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);

  private final int level;

  private TransactionIsolationLevel(int level) {
    this.level = level;
  }

  public int getLevel() {
    return level;
  }
}
